/*******************************************************************************
 * Copyright (c) 2007, Geophysical Center RAS
 * Sergey Berezin, Dmitry Voitsekhovskiy
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms,
 * with or without modification, are permitted provided
 * that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 *
 * - Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * - Neither the name of the Geophysical Center RAS nor the names
 * of its contributors may be used to endorse or promote products
 * derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
 * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 ******************************************************************************/
using System;

using VisualEsse.DataEngine.Types;

namespace VisualEsse.DataEngine
{
    public abstract class DataProvider : ITimeContext, IDisposable
    {
        public DataProvider(string homeDirectory) 
            : this(homeDirectory, true)
        {
        }

        public DataProvider(string homeDirectory, bool createDefaultMetadataProvider)
        {
            if (createDefaultMetadataProvider)
            {
                metadataProvider = EsseMetadataProvider.CreateEsseMetadataProvider(homeDirectory);
                //gridMin = metadataProvider.Spatial.Domain.LowerLeft;
                //gridMax = metadataProvider.Spatial.Domain.UpperRight;
                //gridStep = metadataProvider.Spatial.Step;
                //timeMax = metadataProvider.Time.DateTo;
                //timeMin = metadataProvider.Time.DateFrom;
                //timeStep = metadataProvider.Time.TimeStep;
            }
        }

        protected MetadataProvider metadataProvider;

        public MetadataProvider MetadataProvider
        {
            get { return metadataProvider; }
        }

        public virtual GeoPoint GlobalMin 
        {
            get { return new GeoPoint(GeoPoint.LatitudeMin, GeoPoint.LongitudeMin); }
        }

        public virtual GeoPoint GlobalMax 
        {
            get { return new GeoPoint(GeoPoint.LatitudeMax, GeoPoint.LongitudeMax); ; }
        }

        //protected GeoPoint gridMin;
        //protected GeoPoint gridMax;
        //protected GeoPoint gridStep;
        //protected DateTime timeMin;
        //protected DateTime timeMax;
        //protected TimeSpan timeStep;

        //public virtual GeoPoint GridMin
        //{
        //    get { return gridMin; }
        //}

        //public virtual GeoPoint GridMax
        //{
        //    get { return gridMax; }
        //}

        //public virtual GeoPoint GridStep
        //{
        //    get { return gridStep; }
        //}       

        //public virtual DateTime TimeMin
        //{
        //    get { return timeMin; }
        //}

        //public virtual DateTime TimeMax
        //{
        //    get { return timeMax; }
        //}

        //public virtual TimeSpan TimeStep
        //{
        //    get { return timeStep; }
        //}


        public virtual GeoPoint GridMin
        {
            get { return metadataProvider.SpatialGrid.Domain.LowerLeft; }
        }

        public virtual GeoPoint GridMax
        {
            get { return metadataProvider.SpatialGrid.Domain.UpperRight; }
        }

        public virtual GeoPoint GridStep
        {
            get { return metadataProvider.SpatialGrid.Step; }
        }

        public virtual DateTime TimeMin
        {
            get { return metadataProvider.TemporalGrid.DateFrom; }
        }

        public virtual DateTime TimeMax
        {
            get { return metadataProvider.TemporalGrid.DateTo; }
        }

        public virtual TimeSpan TimeStep
        {
            get { return metadataProvider.TemporalGrid.TimeStep; }
        }

        public abstract IGrid2dDataSource CreateDataSource(EsseParameterDescription parameter, DateTime when);

        #region IDisposable Members

        private bool disposed = false;

        ~DataProvider()
        {
            if (!disposed)
                Dispose();
        }

        public virtual void Dispose()
        {
            disposed = true;
            GC.SuppressFinalize(this);
        }

        #endregion

    }
}
